python wx模块 | 您所在的位置:网站首页 › python wx教程 › python wx模块 |
不说废话,直接奔正题。 python版本是python2.7,需要的模块有argparse,easygui,wx。
主界面如下图(非常丑见谅!) 代码如下: # !coding=gbk #author:zichen import wx, os import easygui import threading import argparse from Queue import Queue import pinger class Host_is_alive_Frame(wx.Frame): def __init__(self): self.q = Queue() self.list_values = [] self.count = 0 self.gauge_value = 0 self.sum = 1 wx.Frame.__init__(self, None, -1, "主机存活探测工具".decode("gbk"), size=(600, 400), style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX) panel = wx.Panel(self, -1) wx.StaticText(panel, -1, "Ping:", pos=(4, 6)) #########设置字体########## # font = wx.Font(12, wx.DECORATIVE, wx.NORMAL, wx.NORMAL) # ping_Label.SetFont(font) #################输入文本框################### self.basicText = wx.TextCtrl(panel, -1, "127.0.0.1", pos=(35, 4), size=(160, -1)) self.basicText.SetInsertionPoint(0) ############动态改变文本框的内容################# self.Bind(wx.EVT_TEXT_ENTER, self.bt_value, self.basicText) ###########添加按钮############ self.button_add = wx.Button(panel, -1, "添加".decode("gbk"), pos=(200, 2), size=(40, -1)) self.Bind(wx.EVT_BUTTON, self.On_add_Clik, self.button_add) self.button_add.SetDefault() ##########加载文件按钮############ self.button_load_file = wx.Button(panel, -1, "加载文件".decode("gbk"), pos=(245, 2), size=(80, -1)) self.Bind(wx.EVT_BUTTON, self.On_load_file_Clik, self.button_load_file) self.button_load_file.SetDefault() ##############清除按钮############# self.button_clear = wx.Button(panel, -1, "清除".decode("gbk"), pos=(330, 2), size=(80, -1)) self.Bind(wx.EVT_BUTTON, self.On_clear_Clik, self.button_clear) self.button_clear.SetDefault() ##############下拉框############### wx.StaticText(panel, -1, "线程数:".decode("gbk"), pos=(415, 8)) # thread_Label.SetFont(font) sampleList = ["10", "50", "100", "200", "500"] self.thread_num = wx.Choice(panel, -1, pos=(460, 4), choices=sampleList) ##############开始按钮############## self.button_action = wx.Button(panel, -1, "开始探测".decode("gbk"), pos=(515, 2), size=(80, -1)) self.Bind(wx.EVT_BUTTON, self.On_action_Clik, self.button_action) self.button_action.SetDefault() #################输入文本框################### self.multiText1 = wx.TextCtrl(panel, -1, "", pos=(50, 50), size=(200, 270), style=wx.TE_MULTILINE) # 创建一个文本控件 self.multiText1.SetInsertionPoint(1) # 设置插入点 #################输出文本框################### self.multiText2 = wx.TextCtrl(panel, -1, "", pos=(300, 50), size=(200, 270), style=wx.TE_MULTILINE) # 创建一个文本控件 self.multiText2.SetInsertionPoint(2) # 设置插入点 #################进度条################## self.gauge_text = wx.StaticText(panel, -1, "进度条:".decode("gbk"), pos=(0, 343)) self.gauge = wx.Gauge(panel, -1, 100, pos=(45, 340), size=(500, 25)) self.gauge.SetBezelFace(3) self.gauge.SetShadowWidth(3) self.Bind(wx.EVT_IDLE, self.OnIdle) self.info = wx.TextCtrl(panel, -1, "0%".decode("gbk"), pos=(550, 345), style=wx.TE_READONLY | wx.TE_MULTILINE | wx.BORDER_NONE | wx.BRUSHSTYLE_TRANSPARENT) self.info.SetBackgroundColour(panel.BackgroundColour) # 进度条函数 def OnIdle(self, event): self.gauge_value = self.count * 100 / self.sum print "self.gauge_value:" + str(self.gauge_value) self.gauge.SetValue(self.gauge_value) # self.gauge.Update() self.info.SetValue(str(self.gauge_value) + "%") # self.info.Update() # 添加按钮函数 def On_add_Clik(self, event): self.button_add.SetLabel("添加".decode("gbk")) #######队列去重####### if self.bt_value() not in self.list_values: self.list_values.append(self.bt_value()) if self.multiText1.GetValue() == "": self.multiText1.SetValue(self.bt_value()) else: self.multiText1.AppendText("\n" + self.bt_value()) else: # 消息对话框 dlg = wx.MessageDialog(None, '输入的内容有重复的值,已自动去重'.decode("gbk"), '警告'.decode("gbk"), wx.OK | wx.ICON_QUESTION) dlg.ShowModal() dlg.Destroy() # 加载文件按钮函数 def On_load_file_Clik(self, event): self.button_load_file.SetLabel("加载文件".decode("gbk")) file_path = easygui.fileopenbox(default='*.txt') with open(file_path) as old_file: os.path.basename(file_path) text = old_file.read() if "\r" in text: temp_lists = (text.split("\r")) elif "\n" in text: temp_lists = (text.split("\n")) else: pass for temp_list in temp_lists: if temp_list not in self.list_values: self.list_values.append(temp_list) if self.multiText1.GetValue() == "": self.multiText1.SetValue(temp_list) else: self.multiText1.AppendText("\n" + temp_list) else: # 消息对话框 dlg = wx.MessageDialog(None, '输入的内容有重复的值,已自动去重'.decode("gbk"), '警告'.decode("gbk"), wx.OK | wx.ICON_QUESTION) dlg.ShowModal() dlg.Destroy() # 清除文本框1的函数 def On_clear_Clik(self, event): self.multiText1.Clear() self.list_values = [] self.count = 0 # 执行探测函数 def On_action_Clik(self, event): self.button_action.SetLabel("开始探测".decode("gbk")) # 清除文本框2 self.multiText2.Clear() thread_nums = self.thread_num.GetStringSelection() for list_value in self.list_values: self.q.put(str(list_value)) # 开始多线程 if thread_nums == "": thread_nums = "10" dlg = wx.MessageDialog(None, '已将线程数默认设置成10'.decode("gbk"), '警告'.decode("gbk"), wx.OK | wx.ICON_QUESTION) dlg.ShowModal() dlg.Destroy() threads = [] for thread_num in range(0, int(thread_nums)): threads.append(threading.Thread(target=self.thread_ping, args=(thread_num,))) for thread in threads: thread.start() # 多线程函数 def thread_ping(self, num): while True: if not self.q.empty(): str_value = self.q.get() self.sum = len(self.list_values) self.count = self.count + 1 """执行ping命令 ping_echo = os.popen("ping " + str_value + " -n 1") content = ping_echo.read() if "TTL" in content: print str_value if self.multiText2.GetValue()=="": self.multiText2.SetValue(str_value) else: self.multiText2.AppendText("\r" + str_value)""" # stock编程 使用了s0nnet编写的程序 parser = argparse.ArgumentParser(description='Python ping') parser.add_argument('--target-host', action="store", dest="target_host", required=True) given_args = '--target-host' target_host = str_value pinger_value = pinger.Pinger(target_host=target_host) flag = pinger_value.ping() if True == flag: if self.multiText2.GetValue() == "": self.multiText2.SetValue(str_value) self.multiText2.Update() else: self.multiText2.AppendText("\r" + str_value) self.multiText2.Update() continue # panel.Update() break # 返回输入框的值 def bt_value(self): return self.basicText.GetValue() if __name__ == '__main__': app = wx.App(False) frame = Host_is_alive_Frame() frame.Show() app.MainLoop() pinger的程序是采用的GitHub 的s0nnet写icmp stock编程链接如下(这里感谢一下s0nnet): https://github.com/Lingerhk/hacking_script/blob/master/net_attacking/icmp_ping_tool.py 有部分地方改动了一下: ICMP_ECHO_REQUEST = 8 # Platform specific DEFAULT_TIMEOUT = 0.3 DEFAULT_COUNT = 1
def ping(self): """ Run the ping process """ for i in xrange(self.count): # print "Ping to %s..." % self.target_host, try: delay = self.ping_once() except socket.gaierror, e: # print "Ping failed. (socket error: '%s')" % e[1] return False break if delay == None: # print "Ping failed. (timeout within %ssec.)" % self.timeout return False else: # 输出主机存活的信息 # delay = delay * 1000 # print "Get pong in %0.4fms" % delay return True
wx,光是界面的调整就浪费了我很多时间,我接下来就不会深入的学习wx,如果有人对wx感兴趣的话,可以查看wx的中文文档,下载链接如下: https://pan.baidu.com/s/1jX6W2au_aAZdSjqS4jy2rA
|
CopyRight 2018-2019 实验室设备网 版权所有 |